<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>call、apply、bind</title>
</head>
<body>
  
</body>
<script>
  let dog = {
    name: "旺财",
    sayName() {
      console.log('[ 我是 ] >', this.name)
    },
    eat(food1, food2) {
      console.log('[ 我喜欢吃 ] >', food1, food2)
    }
  }

  let cat = {
    name: "喵喵"
  }

  // call可以调用函数，call可以改变函数中this指向
  dog.sayName(cat); // 让cat 去用 dog 的 sayName

  /**
   * call (入参是字符串，数字之类的)
   * param1 你要改变this的对象
   * paramN 调用的这个方法的入参
   * */
  dog.eat.call(cat, "鱼", "肉");

  /**
   * apply (入参是数组)
   * param1 你要改变this的对象
   * paramN 调用的这个方法的入参
   * */
  dog.eat.apply(cat, ["鱼", "肉"]);

  /**
   * bind (一般入参都是字符串，数字之类的)【bind不会调用，需要返回接收一个函数后，再次调用才会执行】
   * param1 你要改变this的对象
   * paramN 调用的这个方法的入参
   * */
  let fun = dog.eat.bind(cat, "鱼", "肉");
  fun();

  
</script>
</html>